---
id: inject
title: 2.4 神奇的 Inject
sidebar_label: 2.4 神奇的 Inject
---

import useBaseUrl from "@docusaurus/useBaseUrl";

## 2.4.1 `Inject` 设计

`Inject [ɪnˈdʒekt]` 意思是 `注入，注射` 的意思，在这里意为使用最小的侵入式对应用进行机能改造。

`Inject()` 方法是 `Furion` 框架提供的最小侵入式的方法，可以让任何 `ASP.NET Core` Web 后端项目瞬间支持所有 `Furion` 框架特性。

## 2.4.2 `Inject` 方法有哪些

- `Inject()`：在 `Progame.cs` 中注册
- `AddInject()`：在 `Startup.cs` 的 `ConfigureServices` 中注册
- `AddInjectBase()`：在 `Startup.cs` 的 `ConfigureServices` 中注册
- `AddInjectWithUnifyResult()/ AddInjectWithUnifyResult<T>()`：在 `Startup.cs` 的 `ConfigureServices` 中注册
- `UseInject()`：在 `Startup.cs` 的 `Configure` 中注册
- `UseInjectBase()`：在 `Startup.cs` 的 `Configure` 中注册

## 2.4.3 在 `Progame.cs` 中使用

### 2.4.3.1 `Inject()` 方法

`Inject()` 是在启动程序 `Progame.cs` 中使用的，集成 `Furion` 框架唯一方法，如：

```cs {6,18} title="Furion.Web.Entry\Program.cs"
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace Furion.Web.Entry
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            return Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.Inject()
                              .UseStartup<Startup>();
                });
        }
    }
}
```

## 2.4.4 `Startup.ConfigureServices` 使用

### 2.4.4.1 `AddInject()` 方法

`AddInject()` 方法是在 `Startup.cs` 的 `ConfigureServices` 中提供最基础功能的注册。

`AddInject()` 包含以下基础功能注册：

```cs
services.AddSpecificationDocuments([swaggerGen])
        .AddDynamicApiControllers()
        .AddDataValidation()
        .AddFriendlyException();
```

使用如下：

```cs {3,5,7,10}
namespace Furion.Web.Entry
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddInject();   // 支持直接注册（和下面代码二选一，不能同时注册两次）

            services.AddControllers()
                    .AddInject();   // 支持链式注册（和上面代码二选一，不能同时注册两次）
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            // 其他代码
        }
    }
}
```

### 2.4.4.2 `AddInjectBase()` 方法

`AddInjectBase()` 方法是在 `Startup.cs` 的 `ConfigureServices` 中提供最基础功能的注册。

`AddInjectBase()` 包含以下基础功能注册：

```cs
services.AddDynamicApiControllers()
        .AddDataValidation()
        .AddFriendlyException();
```

如果传入 `AddInjectBase(false)`，则相当于以下功能注册（不包含动态 API）：

```cs
services.AddDataValidation()
        .AddFriendlyException();
```

使用同上 `AddInject()`。

### 2.4.4.5 `AddInjectWithUnifyResult()` 方法

`AddInjectWithUnifyResult()` 方法实际上等同于：

```cs
services.AddInject([swaggerGen])
        .AddUnifyResult();
```

使用同上 `AddInject()`。

:::warning 特别注意

所有 `.AddInject****()` 方法不能同时注册，只能取其一。

:::

## 2.4.5 `Startup.Configure` 使用

### 2.4.5.1 `UseInject()` 方法

`UseInject()` 方法是在 `Startup.cs` 的 `Configure` 中提供最基础功能的注册。

`UseInject()` 包含以下基础功能注册：

```cs
app.UseSpecificationDocuments();
```

使用如下：

```cs {3,5,12}
namespace Furion.Web.Entry
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            // 其他代码
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseInject();    // 包含最小 Swagger 注册
        }
    }
}
```

### 2.4.5.1 `UseInjectBase()` 方法

`UseInjectBase()` 方法是在 `Startup.cs` 的 `Configure` 中提供最基础功能的注册。

`UseInjectBase()` 实际上是个空方法，为了规范化代码特意建立的。

使用同上 `UseInject()`。

## 2.4.6 反馈与建议

:::note 与我们交流

给 Furion 提 [Issue](https://gitee.com/dotnetchina/Furion/issues/new?issue)。

:::